{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-01-14T09:45:15.026033Z",
     "start_time": "2025-01-14T09:45:13.256293Z"
    }
   },
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import datasets"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:51:20.483092Z",
     "start_time": "2025-01-14T09:51:20.476387Z"
    }
   },
   "cell_type": "code",
   "source": [
    "x=np.arange(0,12).reshape(3,4)\n",
    "y=np.array([True,False,True])\n",
    "print(y)\n",
    "print(x)\n",
    "x[y,1]"
   ],
   "id": "4643d9d3e9ab3983",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ True False  True]\n",
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([1, 9])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:52:13.538309Z",
     "start_time": "2025-01-14T09:52:13.528631Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#x是特征，y是标签\n",
    "x, y = datasets.make_moons(n_samples=50000, noise=0.4, random_state=42)\n",
    "print(x.shape)\n",
    "print(y.shape)\n",
    "print(np.unique(y))"
   ],
   "id": "a32ee89c6eec26fd",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(50000, 2)\n",
      "(50000,)\n",
      "[0 1]\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:52:14.640544Z",
     "start_time": "2025-01-14T09:52:14.428631Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "plt.scatter(x[y == 0, 0], x[y == 0, 1])  #拿到特征中标签为0的第0列，拿到标签为0的第一列\n",
    "plt.scatter(x[y == 1, 0], x[y == 1, 1]) #拿到特征中标签为1的第0列，拿到标签为1的第一列\n",
    "plt.legend(['0', '1'])\n",
    "plt.show()  #图形的点颜色是自动的"
   ],
   "id": "5e73dc45ce061235",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:52:22.489343Z",
     "start_time": "2025-01-14T09:52:22.485528Z"
    }
   },
   "cell_type": "code",
   "source": "x[0:10]",
   "id": "5d75e1485cc00167",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.78289718, -0.16428162],\n",
       "       [ 0.02242019,  1.17073445],\n",
       "       [ 0.48760842, -0.09553365],\n",
       "       [ 0.6134801 ,  1.23902749],\n",
       "       [ 1.21824579, -0.52651284],\n",
       "       [ 1.16972893,  0.35597536],\n",
       "       [ 0.61357472,  1.29708332],\n",
       "       [ 1.96089819,  0.29135855],\n",
       "       [ 0.56367427,  1.07002237],\n",
       "       [ 0.20679826, -0.27104344]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:52:26.761113Z",
     "start_time": "2025-01-14T09:52:26.757548Z"
    }
   },
   "cell_type": "code",
   "source": "np.unique(y)",
   "id": "a29109c11da90f88",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:52:33.303455Z",
     "start_time": "2025-01-14T09:52:33.244073Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#默认分割比例是75%和25%\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)"
   ],
   "id": "98cbd0008804d1d5",
   "outputs": [],
   "execution_count": 12
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:52:37.569596Z",
     "start_time": "2025-01-14T09:52:37.483937Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "#逻辑回归是搞分类的\n",
    "log_clf = LogisticRegression()\n",
    "log_clf.fit(x_train, y_train)\n",
    "log_clf.score(x_test, y_test)"
   ],
   "id": "cc3485ec6ff02335",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.83152"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:53:32.741816Z",
     "start_time": "2025-01-14T09:53:13.654622Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "svm_clf = SVC() #支持向量机\n",
    "svm_clf.fit(x_train, y_train)\n",
    "svm_clf.score(x_test, y_test)"
   ],
   "id": "5989d85be5d6831e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.85968"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:54:03.662741Z",
     "start_time": "2025-01-14T09:54:03.469059Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "dt_clf = DecisionTreeClassifier()\n",
    "dt_clf.fit(x_train, y_train)\n",
    "dt_clf.score(x_test, y_test)"
   ],
   "id": "9533b9a806930b1d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.79768"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#  手动实现投票分类器",
   "id": "9ee3587031f3c6a8"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:54:27.695671Z",
     "start_time": "2025-01-14T09:54:19.273206Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#训练好模型，测试集做预测\n",
    "y_predict1 = log_clf.predict(x_test)\n",
    "y_predict2 = svm_clf.predict(x_test)\n",
    "y_predict3 = dt_clf.predict(x_test)"
   ],
   "id": "fa32636d0b8fcf05",
   "outputs": [],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:54:27.700156Z",
     "start_time": "2025-01-14T09:54:27.696669Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#bagging，纯手动bagging\n",
    "y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2, dtype='int')\n",
    "y_predict[:10]"
   ],
   "id": "1aa1e012d4862b36",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 0, 1, 0, 0, 0, 0, 1])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T09:54:30.435644Z",
     "start_time": "2025-01-14T09:54:30.430882Z"
    }
   },
   "cell_type": "code",
   "source": "y_test[:10]",
   "id": "4a66bfced0e7e7b1",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 0, 0, 0, 0, 1, 0, 1])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:04:58.811801Z",
     "start_time": "2025-01-14T10:04:58.807227Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "#accuracy_score计算准确率的\n",
    "accuracy_score(y_test, y_predict)"
   ],
   "id": "f928c1202c233df3",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.85024"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 集成学习VotingClassifier(并行)",
   "id": "dc969a3b2f1d122"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:05:25.796409Z",
     "start_time": "2025-01-14T10:05:25.746843Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.ensemble import VotingClassifier\n",
    "\n",
    "#hard模式就是少数服从多数\n",
    "voting_clf = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()),\n",
    "    ('svm_clf', SVC()),\n",
    "    ('dt_clf', DecisionTreeClassifier())], voting='hard')"
   ],
   "id": "9ae0d87bf92874a3",
   "outputs": [],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:05:51.353026Z",
     "start_time": "2025-01-14T10:05:30.788525Z"
    }
   },
   "cell_type": "code",
   "source": [
    "voting_clf.fit(x_train, y_train)\n",
    "voting_clf.score(x_test, y_test)"
   ],
   "id": "14312205258f9c53",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.85048"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:07:08.276421Z",
     "start_time": "2025-01-14T10:05:51.354027Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# hard和soft区别请看课件解释,训练时间久\n",
    "voting_clf2 = VotingClassifier(estimators=[\n",
    "    ('log_clf', LogisticRegression()),\n",
    "    ('svm_clf', SVC(probability=True)),  #支持向量机中需要加入probability\n",
    "    ('dt_clf', DecisionTreeClassifier())], voting='soft')\n",
    "voting_clf2.fit(x_train, y_train)\n",
    "voting_clf2.score(x_test, y_test)"
   ],
   "id": "b0ea62be7946b8b0",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.84344"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:07:08.280324Z",
     "start_time": "2025-01-14T10:07:08.277422Z"
    }
   },
   "cell_type": "code",
   "source": "50000*0.75",
   "id": "c9f4c48b8bd02bc5",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500.0"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:07:10.772717Z",
     "start_time": "2025-01-14T10:07:08.281330Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "\n",
    "#估计器数目是5000呢？bootstrap是有放回抽样,max_samples不可以超过训练集的数目37500\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=300,\n",
    "                                max_samples=3000, bootstrap=True)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)"
   ],
   "id": "afa080f5a332675e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.85912"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#  oob设计",
   "id": "4e926b426d23aeaa"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:07:16.640231Z",
     "start_time": "2025-01-14T10:07:13.416649Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier\n",
    "#当去做有放回的抽样时，把没有取到的样本作为验证集，可以用oob_score来评估\n",
    "bagging_clf2 = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=1000,\n",
    "                                 bootstrap=True,\n",
    "                                 oob_score=True)\n",
    "bagging_clf2.fit(x_train, y_train)\n",
    "bagging_clf2.oob_score_  #拿没有取到的样本作为验证集"
   ],
   "id": "c3116702d050e9da",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8625066666666666"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:08:14.789461Z",
     "start_time": "2025-01-14T10:08:14.410371Z"
    }
   },
   "cell_type": "code",
   "source": "bagging_clf2.score(x_test, y_test)",
   "id": "fbda257464172c50",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8588"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "### njobs",
   "id": "99c4ae97f8f6e92"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:09:01.570917Z",
     "start_time": "2025-01-14T10:09:01.568217Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.tree import DecisionTreeClassifier  #用决策树集成上千模型\n",
    "from sklearn.ensemble import BaggingClassifier"
   ],
   "id": "8050c7fd067a3b98",
   "outputs": [],
   "execution_count": 28
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:09:25.345181Z",
     "start_time": "2025-01-14T10:09:18.671239Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%time\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                n_estimators=500, max_samples=5000,\n",
    "                                bootstrap=True)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)\n",
    "#cpu time是实际cpu运行算法时间，wall time是墙上真实时间，就是real time（包含了进程启动时间，I/O等待时间等）"
   ],
   "id": "9701eb48db62fefb",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 4.83 s\n",
      "Wall time: 6.67 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.85704"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 31
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:09:34.646272Z",
     "start_time": "2025-01-14T10:09:33.351267Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%time\n",
    "#多核使用的时间更小, %%time要顶格来写\n",
    "bagging_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                n_estimators=500, max_samples=5000,\n",
    "                                bootstrap=True, n_jobs=-1)\n",
    "bagging_clf.fit(x_train, y_train)\n",
    "bagging_clf.score(x_test, y_test)"
   ],
   "id": "e047a4f152bb95b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 46.9 ms\n",
      "Wall time: 1.29 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.8568"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 32
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#  bootstrap_features  对特征进行采样",
   "id": "a92b83b7b2f6b6b5"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:10:13.703943Z",
     "start_time": "2025-01-14T10:10:11.012403Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#因为我们就两个特征，所以max_features设置为1,得到的分值较低是因为我们特征较少，采用随机特征不合适\n",
    "#这个是只对特征进行采样\n",
    "random_subspaces_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                         n_estimators=500, max_samples=500, oob_score=True,\n",
    "                                         bootstrap=True, n_jobs=-1,\n",
    "                                         max_features=1, bootstrap_features=True)\n",
    "random_subspaces_clf.fit(x, y)\n",
    "random_subspaces_clf.oob_score_"
   ],
   "id": "72693e5718771d10",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8479"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 33
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:10:56.350790Z",
     "start_time": "2025-01-14T10:10:45.274835Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 这里是为了验证总的抽样的样本数不能大于训练集的数目\n",
    "random_patches_clf = BaggingClassifier(DecisionTreeClassifier(),\n",
    "                                       n_estimators=500, max_samples=50000, oob_score=True,\n",
    "                                       bootstrap=True, n_jobs=-1,\n",
    "                                       max_features=1, bootstrap_features=True)\n",
    "random_patches_clf.fit(x, y)\n",
    "random_patches_clf.oob_score_\n",
    "#这个代码有另外一个名字就是随机森林"
   ],
   "id": "4f1dbe1616f39c5a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.76346"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 36
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:12:01.069765Z",
     "start_time": "2025-01-14T10:12:01.066830Z"
    }
   },
   "cell_type": "code",
   "source": "from sklearn.ensemble import RandomForestClassifier",
   "id": "69de7f392b43f761",
   "outputs": [],
   "execution_count": 37
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:12:13.831362Z",
     "start_time": "2025-01-14T10:12:07.353525Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%time\n",
    "\n",
    "rc_clf = RandomForestClassifier(n_estimators=500, random_state=666,\n",
    "                                oob_score=True, n_jobs=-1)\n",
    "rc_clf.fit(x, y)\n",
    "rc_clf.oob_score_"
   ],
   "id": "d385fe3204daec0b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 59 s\n",
      "Wall time: 6.47 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.84544"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 38
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:12:43.151015Z",
     "start_time": "2025-01-14T10:12:42.228615Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%time\n",
    "rc_clf = RandomForestClassifier(max_samples=37500, n_jobs=-1)\n",
    "rc_clf.fit(x_train, y_train)\n",
    "rc_clf.score(x_test, y_test)"
   ],
   "id": "2725002d62cfef5e",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 7.39 s\n",
      "Wall time: 918 ms\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.84448"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:13:14.186975Z",
     "start_time": "2025-01-14T10:13:11.219054Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%time\n",
    "#max_leaf_nodes 最大的叶子结点数\n",
    "rc_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16,\n",
    "                                 random_state=666,\n",
    "                                 oob_score=True, n_jobs=-1)\n",
    "rc_clf2.fit(x, y)\n",
    "rc_clf2.oob_score_"
   ],
   "id": "ba11c118df247b83",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 13.8 s\n",
      "Wall time: 2.96 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.8574"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 40
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "#  Extra-Trees\n",
    "ExtraTreesClassifier 是一种机器学习算法，属于基于决策树的集成方法家族。\n",
    "它随机选择特征子集和数据样本来构建多个决策树，并将它们的预测聚合起来做出最终预测。\n",
    "它可用于分类任务，并以处理嘈杂和高维数据的能力而闻名。"
   ],
   "id": "fd598fad2e83642"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:14:54.103985Z",
     "start_time": "2025-01-14T10:14:50.326760Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.ensemble import ExtraTreesClassifier\n",
    "\n",
    "et_clf = ExtraTreesClassifier(n_estimators=500, oob_score=True,\n",
    "                              bootstrap=True, n_jobs=-1) #n_jobs=-1是使用全部的cpu\n",
    "et_clf.fit(x, y)\n",
    "et_clf.oob_score_"
   ],
   "id": "125ae29e51dfb560",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.84928"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 44
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "#  串行（包含adaboost和GBDT）",
   "id": "23b9392be8513c85"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:15:22.048684Z",
     "start_time": "2025-01-14T10:15:22.045393Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier"
   ],
   "id": "4e361210c07ef44a",
   "outputs": [],
   "execution_count": 47
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:15:31.170458Z",
     "start_time": "2025-01-14T10:15:31.018381Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%time\n",
    "ada_clf = AdaBoostClassifier(DecisionTreeClassifier(),algorithm='SAMME',\n",
    "                             n_estimators=500)\n",
    "ada_clf.fit(x_train, y_train)\n",
    "ada_clf.score(x_test, y_test)"
   ],
   "id": "805e282cb82d7d29",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: total: 141 ms\n",
      "Wall time: 148 ms\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\MECHREV\\AppData\\Roaming\\Python\\Python312\\site-packages\\sklearn\\ensemble\\_weight_boosting.py:514: FutureWarning: The parameter 'algorithm' is deprecated in 1.6 and has no effect. It will be removed in version 1.8.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.79768"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 49
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:23:16.605374Z",
     "start_time": "2025-01-14T10:22:52.528041Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#它默认用的也是决策树，增加了基分类器的数目后，准确率提升\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "\n",
    "gb_clf = GradientBoostingClassifier(max_depth=5, n_estimators=500)\n",
    "gb_clf.fit(x_train, y_train)\n",
    "gb_clf.score(x_test, y_test)"
   ],
   "id": "e4f60b91f3305cc9",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8568"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 51
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-14T10:23:16.610167Z",
     "start_time": "2025-01-14T10:23:16.606375Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import numpy as np\n",
    "\n",
    "print(np.log(9))  #当错误率是0.1时权重是2.19\n",
    "np.log((1-0.5)/0.5)  #当错误率是0.5时，权重是0"
   ],
   "id": "b9d5d18231046d5a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1972245773362196\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "np.float64(0.0)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
